Technical Q&A
Java 09 - Javaでパブリックメソッドを AppleScript
から隠す(1999 年 5 月 17 日)
Q: クラス内に、AppleScript
に公開したくないパブリックメソッドがいくつかあります。Java
コード内でメソッドを公開しないように指定することはできますか。あるいは、そのように指定するには
'aete' を編集しなければならないでしょうか。
A: コード内で簡単に指定できます。クラス情報を持つ
BeanInfo を作成すれば、自動的に生成される 'aete'
リソースからプロパティとメソッドの両方を除外することが可能です。
たとえば、次のような Salad.java
クラスがあるとします。
public class Salad
{
public int msgAmount;
// これが、構成要素のリストに含めたくないメソッド
public void setMsgAmount( int amount ) { msgAmount
= amount; }
public int getMsgAmount( ) { return msgAmount; }
public void addMSG( int amount ){ ... } // hide this too
...
};
|
この場合は、次のようにして SaladBeanInfo.java
を作成できます。
import
java.beans.*;
import java.lang.reflect.*;
public class
SaladBeanInfo extends SimpleBeanInfo
{
public MethodDescriptor[ ] getMethodDescriptors()
{
MethodDescriptor md[ ] = new MethodDescriptor[1];
try
{
md[0] = new MethodDescriptor( getMethod( Salad.class, "addMSG" ), pd );
md[0].setHidden( true );
return md;
}
catch ( IntrospectionException e )
{
e.printStackTrace();
}
return null;
}
public PropertyDescriptor[ ] getPropertyDescriptors()
{
PropertyDescriptor pd[ ] = new PropertyDescriptor[1];
try
{
pd[0] = new PropertyDescriptor( "msgAmount", Salad.class );
pd[0].setHidden( true );
return pd;
}
catch ( Exception e )
{
e.printStackTrace();
}
return null;
}
Method getMethod( Class c, String methodName ) throws
IntrospectionException
{
Method methods[ ] = c.getMethods();
for ( int i = 0; i < methods.length; i++ )
{
if ( methods[i].getName().equals( methodName ))
{
return methods[i];
}
}
throw new IntrospectionException( "No such method ¥"" + methodName + "¥"" );
}
}
|
ここでは、最初にメソッドの記述子を作成し、setHidden(
true )を呼び出して isHidden
プロパティを「true」に設定しています。これによってイントロスペクタ
(introspector) に対し、このメソッドの情報を 'aete'
ジェネレータに返さないということが伝えられます。そのため、このメソッドはアプリケーションに対する
AppleScript の辞書に表示されません。
プロパティを隠す手順は多少異なりますが、きわめて簡単です。上記のコードでは
PropertyDescriptor を作成して、java.beans.FeatureDescriptor
から継承した setHidden()
メソッドを呼び出しています。こうすると、スクリプトの記述者
(および好奇心の強いユーザ)
は、この隠れたプロパティについて知ることができなくなります。
-- Michael Hopkins
Worldwide Developer Technical Support
Technical Q&As | Contents
Previous Question | Next
Question
To contact us, please use the Contact
Us page.
|